#include <bits/stdc++.h>

using uint=unsigned int;
using ll=long long;
using ull=unsigned long long;
using i128=__int128;

const int N=1e6+5;

void Solve(){
    
    return;
}

int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr); std::cout.tie(nullptr);
    int n,k;
    std::cin>>n>>k;
    std::vector<int> arr(n);
    for(int i=0;i<n;i++){
        std::cin>>arr[i];
    }
    sort(arr.begin(),arr.end());
    ll sum=0;
    int l=0,r=n-1;
    while(k--){
        if(arr[l]+arr[l+1]<arr[r]){
            sum+=arr[l]+arr[l+1];
            l+=2;
        }
        else{
            sum+=arr[r];
            r--;
        }
    }
    std::cout<<sum<<std::endl;

    return 0;
}
// 题目：可获得的最小值

// 描述：
// 有一个长度为n的整数数组a，进行k次操作来取出数组中的元素。每次操作必须为以下两种操作之一：(1)取出数组中的最大元素；
// (2)取出数组中最小元素和次小元素。要求进行k次操作后，取出的元素和最小。该怎么取?
// 输入格式
//     第一行 两个整数n和k，表示数组元素个数和操作次数。3<=n<=2*10^5, 1<=k<=99999, 2k<n
//     第二行 n个整数，表示数组元素。1<=ai<=10^9。
// 输出格式
//     一个整数，表示最小的和。
// 输入样例
// 5 1
// 2 5 1 10 6
// 输出格式
// 3